\section{MediaWiki API~\cite{mediawiki}}
En cherchant sur le web nous sommes rapidement tombés sur deux projets
qui répondaient en partie à notre projet :
\begin{itemize}
  \item JWPL~\cite{jwpl} {\bf J}ava {\bf W}iki{\bf P}édia {\bf L}ibrary, une
    librairie écrite entièrement en Java qui permet d'obtenir des informations sur le contenu de Wikipédia
  \item MediaWiki API~\cite{mediawiki_api} , API qui
    permet d'accèder directement au contenues de la base de données de
    Wikipédia.
\end{itemize}

\subsection{API}
Le but de cette API~\cite{mediawiki_api} est de donner un accès direct
et de haut niveau aux données contenues dans la base de données de
MediaWiki. Les différents scripts écrits se connecteront donc sur cette
base et pourront ainsi obtenir et modifier des données.

Comme nous voulions utiliser un langage fonctionnel et spécialement le
langage OCaml~\cite{ocaml}, nous avons rapidement pensé à faire un
binding\footnote{permet l'utilisation d'une bibliothèque logicielle
  dans un autre langage de programmation que celui avec lequel elle a
  été écrite.} de cette API.

\subsection{Utilisation dans le projet}
Rapidement il nous a fallu faire un tri rapide dans l'API et faire
ressortir les quelques fonctions dont nous avions besoin.
Trois fonctionnalités sont ressorties du lot :
\begin{itemize}
  \item {\emph backlinks}\footnote{liens en arrière} : trouve toutes
    les pages qui pointent vers une page donnée.
  \item {\emph inlinks}\footnote{lien en avant} : retourne tous les liens d'une
    page donée.
  \item {\emph wikitext} : parse la page wikipédia et renvoie en
    sortie le code xml correspondant au contenu de la page en
    syntaxe wiki.
\end{itemize} 

\subsubsection{Lien en arrière}
Comme nous l'avons expliqué précédemment, les liens en arrière sont les liens
qui pointent vers une page donnée. L'utilisation est assez simple,
selon la fonction appellée par notre API, nous pouvons récupérer les
{\emph ids} ou les {\emph titres} des pages. Nous avons décidé de
faire ces deux bindings pour montrer la simplicité de cette opération,
mais seul la fonction renvoyant l'ensemble des titres est utilisée
dans notre projet : 

{\tt val backlinks\_titles : page $\rightarrow$ Sets.StringSet.t} \\
L'utilisation reste donc assez simple. Il suffit de donner la page et
nous récupérons directement un ensemble de liens.
Nous verrons dans la suite comment est utilisé cette fonction
(notamment dans le parcours en profondeur et le parcours en largeur).

\subsubsection{Lien en avant}
Les liens en avant sont les liens qui sont sur une page donnée. L'utilisation est également assez simple,
selon la fonction appellée par notre API, nous pouvons récupérer les
{\emph ids} ou les {\emph titres} des pages comme pour les liens en
arrière, mais seul la fonction renvoyant le titre des liens sera utilisée: 

{\tt val inlinks\_titles : page $\rightarrow$ Sets.StringSet.t} \\
L'utilisation reste donc assez simple. Il suffit de donner la page et
nous récupérons directement l'ensemble des liens en avant.
Nous verrons dans la suite comment est utilisée cette fonction
(notamment dans le parcours en profondeur).

\subsubsection{Texte wiki}
Cette fonctionnalité va nous permettre de récupérer très rapidement
le contenu d'une page wikipédia en syntaxe wiki. Nous aurons en
résultat du code xml et le contenu se trouve entre les balises {\tt
  $<$wikitext$>$ ... $<$/wikitext$>$}
Voici la signature de notre fonction : 

{\tt val wiki\_text : page -> string}

Nous utiliserons cette fonction pour le parcours en largeur. En effet
grâce à cela, nous allons pouvoir récupérer le contenu d'une page,
faire un pré-traitement et calculer le résultat demandé. Toute cette
étape est expliqué un peu plus en détail dans la suite.